package orders

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

// OrderGenerator 订单号生成器接口
type OrderGenerator interface {
	Generate() string
}

// 基础订单号生成器
type baseOrderGenerator struct {
	prefix     string     // 订单前缀
	timeFormat string     // 时间格式
	mutex      sync.Mutex // 互斥锁
	seq        int64      // 序列号
}

// NewBaseOrderGenerator 创建基础订单号生成器
func NewBaseOrderGenerator(prefix string) OrderGenerator {
	return &baseOrderGenerator{
		prefix:     prefix,
		timeFormat: "20060102150405",
		seq:        0,
	}
}

// Generate 生成订单号
func (g *baseOrderGenerator) Generate() string {
	g.mutex.Lock()
	defer g.mutex.Unlock()

	now := time.Now()
	timestamp := now.Format(g.timeFormat)
	g.seq++

	// 格式: 前缀 + 时间戳 + 4位随机数 + 3位序列号
	random := rand.Intn(10000)
	return fmt.Sprintf("%s%s%04d%03d", g.prefix, timestamp, random, g.seq%1000)
}
